﻿namespace BlogsAPI.Rdf
{
    using System.Xml.Serialization;

    /// <summary>
    /// DCMI Namespace for the Dublin Core Metadata Element Set, Version 1.1
    /// http://purl.org/dc/elements/1.1/
    /// </summary>
    public abstract class DublinCore
    {
        /// <summary>
        /// A name given to the resource.
        /// </summary>
        /// <remarks>A second property with the same name as this property has been declared in the dcterms:
        ///  namespace (http://purl.org/dc/terms/). See the Introduction to the document "DCMI Metadata Terms"
        ///  (http://dublincore.org/documents/dcmi-terms/) for an explanation.</remarks>
        [XmlAttribute("title", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Title { get; set; }

        /// <summary>
        /// Shadow copy of dc:title attribute
        /// </summary>
        [XmlElement("title", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string _title { get { return Title; } set { Title = value; } }

        /// <summary>
        /// The topic of the resource.
        /// </summary>
        /// <remarks>Typically, the subject will be represented using keywords, key phrases, or classification codes.
        /// Recommended best practice is to use a controlled vocabulary. 
        /// To describe the spatial or temporal topic of the resource, use the Coverage element.</remarks>
        [XmlAttribute("subject", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Subject { get; set; }

        /// <summary>
        /// An account of the resource.
        /// </summary>
        /// <remarks>Description may include but is not limited to: an abstract, a table of contents, 
        /// a graphical representation, or a free-text account of the resource.</remarks>
        [XmlAttribute("description", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Description { get; set; }

        /// <summary>
        /// Shadow copy of dc:title description
        /// </summary>
        [XmlElement("description", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string _description { get { return Description; } set { Description = value; } }

        /// <summary>
        /// An entity responsible for making the resource available.
        /// </summary>
        /// <remarks>Examples of a Publisher include a person, an organization, or a service. 
        /// Typically, the name of a Publisher should be used to indicate the entity.</remarks>
        [XmlAttribute("publisher", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Publisher { get; set; }

        /// <summary>
        /// An entity responsible for making contributions to the resource.
        /// </summary>
        /// <remarks>Examples of a Contributor include a person, an organization, or a service. 
        /// Typically, the name of a Contributor should be used to indicate the entity.</remarks>
        [XmlAttribute("contributor", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Contributor { get; set; }

        /// <summary>
        /// A point or period of time associated with an event in the lifecycle of the resource.
        /// </summary>
        /// <remarks>Date may be used to express temporal information at any level of granularity. 
        /// Recommended best practice is to use an encoding scheme, such as the W3CDTF profile of ISO 8601 [W3CDTF]</remarks>
        [XmlAttribute("date", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Date { get; set; }

        /// <summary>
        /// The nature or genre of the resource.
        /// </summary>
        /// <remarks>Recommended best practice is to use a controlled vocabulary such as 
        /// the DCMI Type Vocabulary [DCMITYPE]. To describe the file format, 
        /// physical medium, or dimensions of the resource, use the Format element.</remarks>
        [XmlAttribute("type", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Type { get; set; }

        /// <summary>
        /// The file format, physical medium, or dimensions of the resource.
        /// </summary>
        /// <remarks>Examples of dimensions include size and duration. Recommended best practice is to use 
        /// a controlled vocabulary such as the list of Internet Media Types [MIME].</remarks>
        [XmlAttribute("format", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Format { get; set; }

        /// <summary>
        /// An unambiguous reference to the resource within a given context.
        /// </summary>
        /// <remarks>Recommended best practice is to identify the resource by means of 
        /// a string conforming to a formal identification system.</remarks>
        [XmlAttribute("identifier", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Identifier { get; set; }

        /// <summary>
        /// A related resource from which the described resource is derived.
        /// </summary>
        /// <remarks>The described resource may be derived from the related resource in whole or in part. 
        /// Recommended best practice is to identify the related resource 
        /// by means of a string conforming to a formal identification system.</remarks>
        [XmlAttribute("source", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Source { get; set; }

        /// <summary>
        /// A language of the resource.
        /// </summary>
        /// <remarks>Recommended best practice is to use a controlled vocabulary such as RFC 4646 [RFC4646].</remarks>
        [XmlAttribute("language", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Language { get; set; }

        /// <summary>
        /// A related resource.
        /// </summary>
        /// <remarks>Recommended best practice is to identify the related resource by means of a string 
        /// conforming to a formal identification system.</remarks>
        [XmlAttribute("relation", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Relation { get; set; }

        /// <summary>
        /// The spatial or temporal topic of the resource, the spatial applicability of the resource, 
        /// or the jurisdiction under which the resource is relevant.
        /// </summary>
        /// <remarks>Spatial topic and spatial applicability may be a named place or 
        /// a location specified by its geographic coordinates. Temporal topic may be a named period, 
        /// date, or date range. A jurisdiction may be a named administrative entity or a geographic 
        /// place to which the resource applies. Recommended best practice is to use a controlled vocabulary 
        /// such as the Thesaurus of Geographic Names [TGN]. Where appropriate, named places or time periods 
        /// can be used in preference to  numeric identifiers such as sets of coordinates or date ranges.</remarks>
        [XmlAttribute("coverage", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Coverage { get; set; }

        /// <summary>
        /// Information about rights held in and over the resource.
        /// </summary>
        /// <remarks>Typically, rights information includes a statement about various property rights 
        /// associated with the resource, including intellectual property rights.</remarks>
        [XmlAttribute("rights", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Rights { get; set; }
    }
}
